package thinkingJava.chapter10;

public class GreenhouseControls extends Controller {
	private boolean light = false;

	public class LightOn extends Event {
		public LightOn(long delayTime) {
			super(delayTime);
		}
		public void action() {
			light = true;
		}
		public String toString() {
			return "Light is on!";
		}
	}
	public class LightOff extends Event {
		public LightOff(long delayTime) {
			super(delayTime);
		}
		public void action() {
			light = false;
		}
		public String toString() {
			return "Light is off!";
		}
	}

	private boolean water = false;
	public class WaterOn extends Event {
		public WaterOn (long delayTime) {
			super(delayTime);
		}
		public void action () {
			water = true;
		}
		public String toString() {
			return "Greenhouse water is on!";
		}
	}
	public class WaterOff extends Event {
		public WaterOff(long delayTime) {
			super(delayTime);
		}
		public void action () {
			water = false;
		}
		public String toString() {
			return "Grennhouse water is off!";
		}
	}

	private String thermstat = "Day";

	public class ThermstatNight extends Event {

		public ThermstatNight(long delayTime) {
			super(delayTime);
		}
		public void action() {
			thermstat = "Night";
		}
		public String toString() {
			return "Greenhouse Thermstat is on night setting!";
		}
	}
	public class ThermstatDay extends Event {
		public ThermstatDay(long delayTime) {
			super(delayTime);
		}
		public void action() {
			thermstat = "Day";
		}
		public String toString() {
			return "Greem Thermstat is on day setting!";
		}
	}
	public class Bell extends Event{
		public Bell(long delayTime) {
			super(delayTime);
		}
		public void action () {
			addEvent(new Bell(delayTime));
		}
		public String toString() {
			return "Bing!!!";
		}
	}
	public class ReStart extends Event {
		private Event[] eventList;
		public ReStart(long delayTime , Event[] eventList) {
			super(delayTime);
			this.eventList = eventList;
			for(Event e : eventList) {
				addEvent(e);
			}
		}
		public void action () {
			for (Event e : eventList) {
				e.start();
				addEvent(e);
			}
			start();
			addEvent(this);
		}
		public String toString() {
			return "Restarting system...";
		}
	}
	public static class Terminate extends Event {
		public Terminate(long delayTime) {
			super(delayTime);
		}
		public void action() {
			System.exit(0);
		}
		public String toString() {
			return "Terminating system...";
		}

	}
	public static void main(String[] args) {
		GreenhouseControls gc = new GreenhouseControls();
		gc.addEvent(gc.new Bell(900));
		Event[] eventList = new Event[]{
				gc.new ThermstatNight(0),
				gc.new LightOn(200),
				gc.new LightOff(400),
				gc.new WaterOn(600),
				gc.new WaterOff(800),
				gc.new ThermstatDay(1400)
		};
		gc.addEvent(gc.new ReStart(2000,eventList));
		if (args.length == 1) {
			gc.addEvent(new Terminate(new Integer(args[0])));
		}
		gc.run();
	}
}
